
package Ventanas;

import Offline.Deshacer;
import Online.Inicio;
import Online.Listas;
import Online.Opciones;
import Online.Tareas;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;

/**
 * @author Alvaro Garcia Tapia
 * @author Pablo Mosquera Diaz
 * @author Victor Navarro Ortego
 * @author Adrian Neila Serrano
 * @author Daniel Sanchez Suarez
 * 
 * @proyecto Gestor de Tareas Online
 * @version 1.61
 */
public class VentanaPreferencias extends JFrame  implements ActionListener{
    
        //Creación de variables
        private String usuario;
        private Ventana ventana;
        private VentanaMapa ventanam;
	private JButton botonGuardar;
	private JButton botonRestaurar;		
        private JLabel labelnLista;
        private JTextField nLista;
        private String nlista;
        private JLabel labelMapa;
        private JTextField Mapa;
        private String mapa;
        private JLabel labelLista;
        private JComboBox Lista;
        private String lista;
        private JLabel labelPass;
        private JPasswordField Pass;
        private String pass;
        private JLabel labelCPass;
        private JPasswordField CPass;
        private String cpass;
        private JLabel labelNPass;
        private JPasswordField NPass;
        private String npass;
        private JLabel labelNombre;
        private JTextField Nombre;
        private String nombre;
        private JLabel labelApellidos;
        private JTextField Apellidos;
        private String apellidos;
        private JLabel labelEmail;
        private JTextField Email;
        private String email;
        private JLabel labelPais;
        private JTextField Pais;
        private String pais;
        private JLabel labelCiudad;
        private JTextField Ciudad;
        private String ciudad;
        private ArrayList<Deshacer> deshacer = new ArrayList<Deshacer>();
        private boolean online;
        
        
        public VentanaPreferencias(String usuario, final Ventana ventana, ArrayList deshacer,
                                final VentanaMapa ventanam, boolean online){
                //constructor JFrame
		super("Preferencias"); 
                
                this.usuario = usuario;
                this.ventana = ventana;
                this.ventanam = ventanam;
                this.deshacer = deshacer;
                this.online = online;
            
                //Opciones de ventana
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
                //se añade la opción de preguntar antes de salir
                addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent evt) {
                        if(ventana != null)
                            ventana.activar();
                        else
                            ventanam.activar();
                        setVisible(false);
                        setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                    }
                });
                
		setSize(500,400);
                setLocationRelativeTo(null);
		Container contenidoPanel = getContentPane();
                contenidoPanel.setBackground(Color.black);
                setIconImage(new ImageIcon(getClass().getResource("objetos/icono.png")).getImage()); 

                // crear objeto JTabbedPane 
                JTabbedPane panelConFichas = new JTabbedPane();
                
                Opciones opciones = this.conectarOpciones();
                String [] datosO = opciones.getOpcion(usuario);
                nlista = datosO[0];
                mapa = datosO[1];
                lista = datosO[2];

                // establecer pane11 y agregarlo al objeto JTabbedPane 
                JPanelConFondo panel1 = new JPanelConFondo();
                panel1.setImagen("objetos/fondo.jpg");
                panel1.setLayout(null);
                panel1(panel1);
                panelConFichas.addTab( "Vista", null, panel1, "Configurar opciones de vista" ); 

                // establecer panel2 y agregarlo al objeto JTabbedPane
                JPanelConFondo panel2 = new JPanelConFondo();
                panel2.setImagen("objetos/fondo.jpg");
                panel2.setLayout(null);
                panel2(panel2);
                panelConFichas.addTab( "Contraseña", null, panel2, "Cambio de contraseña" );

                // establecer panel3 y agregarlo al objeto JTabbedPane
                JPanelConFondo panel3 = new JPanelConFondo();
                panel3.setImagen("objetos/fondo.jpg");
                panel3.setLayout(null);
                panel3(panel3);
                panelConFichas.addTab( "Datos personales", null, panel3, "Cambio de datos personales" );

                // agregar objeto JTabbedPane al contenedor
                getContentPane().add( panelConFichas );

                setVisible(true);
                
        }
        
        /**
         * Metodo para construir el panel 1 o panel de preferencias de visualizacion
         * @param panel 
         */
        private void panel1(JPanelConFondo panel){
                
		labelLista = new JLabel("Lista que se mostrará al inicio del programa:");
                labelLista.setBounds(10,20,300,15);
                labelLista.setForeground(Color.white);
                panel.add(labelLista);
                //Construcción del panel de seleccion de lista
                Listas listas = conectarLista();
                String list [] = listas.getListas(usuario);
                int tam=0;
                for(int i=0;list[i]!=null && i<list.length;i++){tam = i;}
                String[]lists = new String[tam+2];
                for(int i=0;list[i]!=null && i<list.length;i++){
                    lists[i]=list[i];
                }
                lists[lists.length-1]="Favoritos";
                
		this.Lista = new JComboBox(lists);
                //Se rellena el campo lista con el nombre actual
                this.Lista.setSelectedItem(lista);
		this.Lista.setBounds(10,40,200,20);
                panel.add(Lista);
                
                //Cuadrante de introducción del numero de tareas a mostrasr
		labelnLista = new JLabel("Número de tareas de una lista a mostar:");
                labelnLista.setBounds(10,80,300,15);
                labelnLista.setForeground(Color.white);
                panel.add(labelnLista);
		this.nLista = new JTextField();
                //Se rellena el campo nlistas con el numero actual
                this.nLista.setText(nlista);
		this.nLista.setBounds(10,100,200,20);
                panel.add(nLista);
                
                //Cuadrante del numero de tareas a mostrar por mapa
		labelMapa = new JLabel("Número de tareas de un mapa a mostar:");
                labelMapa.setBounds(10,140,300,15);
                labelMapa.setForeground(Color.white);
                panel.add(labelMapa);
		this.Mapa = new JTextField();
                //Se rellena el campo mapa con el numero actual
                this.Mapa.setText(mapa);
		this.Mapa.setBounds(10,160,200,20);
                panel.add(Mapa);
                
                //Constucción del boton Restaurar
		botonRestaurar = new JButton("Restaurar"); 
		panel.add(botonRestaurar);
		botonRestaurar.setBounds(140,285,230,25);
                botonRestaurar.setActionCommand("Restaurar");
		botonRestaurar.addActionListener(this);
                botonRestaurar.setIcon(new ImageIcon(getClass().getResource("objetos/Restaurar.jpg")));
                
                //Constucción del boton Guardar
		botonGuardar = new JButton("Guardar"); 
		panel.add(botonGuardar);
		botonGuardar.setBounds(390,285,80,25);
                botonGuardar.setActionCommand("Guardar");
		botonGuardar.addActionListener(this);
                botonGuardar.setIcon(new ImageIcon(getClass().getResource("objetos/Guardar Tarea.jpg")));
        }
        
        /**
         * Metodo para construir el panel2 o panel de recuperar contraseñas
         * @param panel 
         */
        private void panel2(JPanelConFondo panel){
                
                //Cuadrante de introducción de contraseña antigua
		labelPass = new JLabel("Contraseña antigua:");
                labelPass.setBounds(10,20,300,15);
                labelPass.setForeground(Color.white);
                panel.add(labelPass);              
		this.Pass = new JPasswordField();
		this.Pass.setBounds(10,40,200,20);
                panel.add(Pass);
                
                //Cuadrante de introducción de contraseña nueva
		labelNPass = new JLabel("Nueva contraseña:");
                labelNPass.setBounds(10,80,300,15);
                labelNPass.setForeground(Color.white);
                panel.add(labelNPass);
		this.NPass = new JPasswordField();
		this.NPass.setBounds(10,100,200,20);
                panel.add(NPass);
                
                //Cuadrante de introducción de contraseña nueva
		labelCPass = new JLabel("Confirmación de la nueva contraseña:");
                labelCPass.setBounds(10,140,300,15);
                labelCPass.setForeground(Color.white);
                panel.add(labelCPass);
		this.CPass = new JPasswordField();
		this.CPass.setBounds(10,160,200,20);
                panel.add(CPass);

                
                //Constucción del boton Guardar
		botonGuardar = new JButton("Guardar"); 
		panel.add(botonGuardar);
		botonGuardar.setBounds(390,285,80,25);
                botonGuardar.setActionCommand("Guardar");
		botonGuardar.addActionListener(this);
                botonGuardar.setIcon(new ImageIcon(getClass().getResource("objetos/Guardar Tarea.jpg")));
        }
        
        /**
         * Metodo para construir el panel3 o panel de datos de usuario
         * @param panel 
         */
        private void panel3(JPanelConFondo panel){
            
                Inicio inicio = conectarUsuario();
                String [] datos = inicio.getDatos(usuario);
                
                //Cuadrante de introducción de nombre
		labelNombre = new JLabel("Nombre:");
                labelNombre.setBounds(10,20,300,15);
                labelNombre.setForeground(Color.white);
                panel.add(labelNombre);              
		this.Nombre = new JTextField();
                this.Nombre.setText(datos[0]);
		this.Nombre.setBounds(10,40,200,20);
                panel.add(Nombre);
                
                //Cuadrante de introducción de apellidos
		labelApellidos = new JLabel("Apellidos:");
                labelApellidos.setBounds(250,20,300,15);
                labelApellidos.setForeground(Color.white);
                panel.add(labelApellidos);
		this.Apellidos = new JTextField();
                this.Apellidos.setText(datos[1]);
		this.Apellidos.setBounds(250,40,200,20);
                panel.add(Apellidos);
                
                //Cuadrante de introducción de email
		labelEmail = new JLabel("email:");
                labelEmail.setBounds(10,65,300,15);
                labelEmail.setForeground(Color.white);
                panel.add(labelEmail);
		this.Email = new JTextField();
                this.Email.setText(datos[2]);
		this.Email.setBounds(10,85,200,20);
                panel.add(Email);
                
                
                //Cuadrante de introducción de pais
		labelPais = new JLabel("País:");
                labelPais.setBounds(10,110,300,15);
                labelPais.setForeground(Color.white);
                panel.add(labelPais);
		this.Pais = new JTextField();
                this.Pais.setText(datos[3]);
		this.Pais.setBounds(10,130,200,20);
                panel.add(Pais);
                
                //Cuadrante de introducción de ciudad
		labelCiudad = new JLabel("Ciudad:");
                labelCiudad.setBounds(250,110,300,15);
                labelCiudad.setForeground(Color.white);
                panel.add(labelCiudad);
		this.Ciudad = new JTextField();
                this.Ciudad.setText(datos[4]);
		this.Ciudad.setBounds(250,130,200,20);
                panel.add(Ciudad);

                
                //Constucción del boton Guardar
		botonGuardar = new JButton("Guardar"); 
		panel.add(botonGuardar);
		botonGuardar.setBounds(390,285,80,25);
                botonGuardar.setActionCommand("Guardar");
		botonGuardar.addActionListener(this);
                botonGuardar.setIcon(new ImageIcon(getClass().getResource("objetos/Guardar Tarea.jpg")));
        }
        
        
    /**
     * Metodo para conectar las opciones con la bbdd
     * @return La conexión con la bbdd
     */
    private Opciones conectarOpciones(){
        //Se crea el objeto para actuar contra la bbdd
        Opciones opciones = new Opciones();
        boolean salir = false;
        //Si no se ha conectado
        while (!opciones.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
            this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                opciones = new Opciones();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return opciones;
    }
    
    
    /**
     * Metodo para conectar el usuario con la bbdd
     * @return La conexión con la bbdd
     */
    private Inicio conectarUsuario(){
        Inicio inicio = new Inicio();
        boolean salir = false;
        //Si no se ha conectado
        while (!inicio.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                inicio = new Inicio();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return inicio;
    }
    

    /**
     * Metodo para conectar las listas con la bbdd
     * @return La conexión con la bbdd
     */
    private Listas conectarLista(){
        Listas lista = new Listas();
        boolean salir = false;
        //Si no se ha conectado
        while (!lista.estado() && !salir){
            this.setCursor(Cursor.WAIT_CURSOR);
            String message = "Fallo al conectar con el servidor.\n¿Desea volver a intentar conectar?";
            String title = "Error de conexión";
            //Se ofrece la opcion de reconectar
            int reply = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION);
                this.setCursor(Cursor.DEFAULT_CURSOR);
            //Si rechazo reconectar
            if (reply == JOptionPane.NO_OPTION){     
                this.setCursor(Cursor.WAIT_CURSOR);
                salir=true;
                new VentanaInicio();
                //Se cierra la ventana de login
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }
            //Si se acepto reconectar
            else{
                this.setCursor(Cursor.WAIT_CURSOR);
                //Se reconecta
                lista = new Listas();
                this.setCursor(Cursor.DEFAULT_CURSOR);
            }    
        }
        return lista;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        //Variable que contiene el boton pulsado
         String comando = e.getActionCommand();
         boolean realizado = true;
         int j = 0;

         //Si se pulso el boton Restaurar
            if (comando.equals("Restaurar")){
                Opciones opciones = new Opciones();
                opciones.modificarOpciones("10", "3", "Lista Principal",usuario);
                if(ventana != null)
                    ventana.ActualizarTablas(0, 0,deshacer,online);
                else
                    ventanam.ActualizarTablas(0, 0, deshacer);
                //Se cierra la ventana
                setVisible(false);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
            }
           //Si se pulso el boton Guardar 
            else if (comando.equals("Guardar")){
                lista = Lista.getSelectedItem().toString();
                nlista = nLista.getText();
                mapa = Mapa.getText();
                pass = Pass.getText();
                npass = NPass.getText();
                cpass = CPass.getText();
                nombre = Nombre.getText();
                apellidos = Apellidos.getText();
                email = Email.getText();
                pais = Pais.getText();
                ciudad = Ciudad.getText();
                
                boolean tiempocorrecto = true;
                //Se comprueba que los numeros sean enteros entero
                int numero = 0;
                try {
                    numero = Integer.parseInt(nlista);
                    tiempocorrecto = true;
                } catch (NumberFormatException nfe){
                    tiempocorrecto = false;
                }
                if(!tiempocorrecto || numero <= 0){
                    realizado = false;
                    JOptionPane.showMessageDialog (null,"Debe indicar un número válido para número de tareas por lista.",
				"Atención", JOptionPane.ERROR_MESSAGE);
                }
                else{
                    try {
                        numero = Integer.parseInt(mapa);
                        tiempocorrecto = true;
                    } catch (NumberFormatException nfe){
                        tiempocorrecto = false;
                    }
                    if(!tiempocorrecto || numero <= 0 || numero >10){
                        realizado = false;
                        JOptionPane.showMessageDialog (null,"Debe indicar un número válido para número de tareas por mapa.",
				"Atención", JOptionPane.ERROR_MESSAGE);
                    }
                    else{
                        if(lista.equals("")){
                            realizado = false;
                            JOptionPane.showMessageDialog (null,"Debe indicar una lista de inicio.",
				"Atención", JOptionPane.ERROR_MESSAGE);
                        }
                        else{
                            Opciones opciones = new Opciones();
                            opciones.modificarOpciones(nlista, mapa, lista, usuario);
                            Listas Lista = conectarLista();
                            String[] list = Lista.getListas(usuario);
                            boolean cond= true;
                            for(int i=0;list[i]!=null && i<list.length && cond;i++){
                                if(list[i].equals(lista)){
                                    cond =false;
                                    j=i;
                                }
                            }
                            realizado = true;
                        }
                    }
                }
                
                if((!npass.equals("") || !pass.equals("") || !cpass.equals(""))&&(realizado)){
                    Inicio  inicio = conectarUsuario();
                    if (!inicio.Login(usuario, pass)){
                        realizado = false;
                        JOptionPane.showMessageDialog (null,"La contraseña actual no es correcta.",
				"Atención", JOptionPane.ERROR_MESSAGE);
                    }
                    else{
                        if(!npass.equals(cpass)){
                            realizado = false;
                            JOptionPane.showMessageDialog (null,"Contraseña incorrecta, verifique que la contraseña y su comprobación sean iguales.",
				"Atención", JOptionPane.ERROR_MESSAGE);
                        }
                        else{
                            inicio.setPass(usuario, npass);
                            realizado = true;
                        }
                    }
                }
                
                if (realizado){
                    if((nombre.equals("") || apellidos.equals("") || email.equals("")
                            || pais.equals("") || ciudad.equals(""))){
                            realizado = false;
                            JOptionPane.showMessageDialog (null,"Debe rellenar todos los campos referentes a sus datos.",
                                    "Atención", JOptionPane.ERROR_MESSAGE);

                    }
                    else{
                        Inicio inicio = conectarUsuario();
                        inicio.setDatos(usuario,nombre, apellidos,email,pais,ciudad);
                    }
                }
                
                if (realizado){
                    if(ventana != null)
                        ventana.ActualizarTablas(j, 0,deshacer,online);
                    else
                        ventanam.ActualizarTablas(j, 0, deshacer);
                    //Se cierra la ventana
                    setVisible(false);
                    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
                }
            }
    }
    
}

